package com.literature.search.core.utils.sp;

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpUtil;
import com.literature.search.core.config.mongo.MongoConfig;
import com.literature.search.core.config.satoken.RoleEnum;
import com.literature.search.core.entity.R.AjaxError;
import com.literature.search.core.entity.R.AjaxJson;
import com.literature.search.core.entity.Role;
import com.literature.search.core.entity.User;
import com.literature.search.core.utils.NbUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;

/**
 * @Author: DangKong
 * @Date: 2023/3/1 22:58
 * @Description: 工具类：SpRoleUtil
 */

@Component
public class SpRoleUtil {


    private static MongoTemplate mongoTemplate;
    @Autowired
    public void setMongoTemplate(MongoTemplate mongoTemplate) {
        SpRoleUtil.mongoTemplate = mongoTemplate;
    }


    /**
     * 验证一个SysRole对象 是否符合标准
     * @param s
     * @return
     */
    static AjaxJson checkRole(Role s) {

        // 1、名称相关
        if(NbUtil.isNull(s.getRoleName())) {
            return AjaxJson.getError("昵称不能为空");
        }
        // 2、如果该名称已存在，并且不是当前角色
        // 根据角色名查询角色
        Role s2 = mongoTemplate.findOne(new Query(Criteria.where("roleName").is(s.getRoleName())), Role.class);

        if(s2 != null && !(s2.getId() == s.getId())) {
            return AjaxJson.getError("该角色名已存在");
        }
        // 重重检验，最终合格
        return AjaxJson.getSuccess();
    }

    /**
     * 验证一个Role是否符合标准, 不符合则抛出异常
     * @param s
     */
    public static void checkRoleThrow(Role s) {
        AjaxJson aj = checkRole(s);
        if(aj.getCode() != AjaxJson.CODE_SUCCESS){
            throw AjaxError.get(aj.getMsg());
        }
    }


    /**
     * 获取指定 User 账号的 roleId
     */
    public static int getRoleIdByUserId(String userId) {
        // 先获取其 User-Session
        SaSession session = StpUtil.getSessionByLoginId(userId, false);
        if(session == null) {
            // 如果此账号的 User-Session 尚未创建，则直接查库，避免创建 Session 缓存
            return MongoConfig.mongoTemplate.findOne(new Query(Criteria.where("id").is(userId)), User.class).getRoleId();
        }
        // 从 Session 中获取
        return session.get(RoleEnum.ROLE_ID_KEY, () -> MongoConfig.mongoTemplate.findOne(new Query(Criteria.where("id").is(userId)), User.class).getRoleId());
    }

    /**
     * 清空指定 User 账号的 roleId 值缓存
     */
    public static void clearRoleIdCache(long userId) {
        // 先获取其 User-Session
        SaSession session = cn.dev33.satoken.stp.StpUtil.getSessionByLoginId(userId, false);
        if(session == null) {
            // 如果此账号的 User-Session 尚未创建，则不执行任何动作
            return;
        }
        // 清空值
        session.delete(RoleEnum.ROLE_ID_KEY);
    }


}
